﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using SevenInvaders.common;

namespace SevenInvaders.LEVEL_JACK
{
    class Level_Jack
    {
        Jack_Ship jack_Ship;
        int shipVidaAnterior;
        Cenario fundo1;
        Cenario fundo2;
        Cenario fundo3;
        Boolean meteorON = true;
        Random random = new Random();
        Energia energia;
        Texture2D vida;
        Boolean mudarQtdVidas = true;
        int qtdVidas;
        int vidaPosX = 0;
        Boolean menosVida = false;

        Temporizador tempoNave;
        Temporizador tempoPedacos;

        public static Texture2D jack_tiro;
        public static Texture2D jack_asteroide1;
        public static Texture2D jack_m_piece1;
        public static Texture2D jack_m_piece2;
        public static Texture2D jack_m_piece3;
        public static Texture2D jack_m_piece4;
        public static Texture2D jack_m_piece5;

        public enum JogoEstado{Cena_Inicio, Jogo, Cena_Final, Boss, Pause, GameOver}
        public JogoEstado jogoEstado_atual = JogoEstado.Cena_Inicio;

        public Level_Jack(ContentManager content, GameWindow window)
        {
            jack_Ship = new Jack_Ship(content.Load<Texture2D>("LEVEL_JACK/ship_body"),
                new Vector2(-300, window.ClientBounds.Height / 2 - 44), 1, window, content);
            fundo1 = new Cenario(content.Load<Texture2D>("LEVEL_JACK/Fundo_1"), new Rectangle(0, 0, 1067, 600));
            fundo2 = new Cenario(content.Load<Texture2D>("LEVEL_JACK/Fundo_2"), new Rectangle(0, 0, 1218, 600));
            fundo3 = new Cenario(content.Load<Texture2D>("LEVEL_JACK/Fundo_2"), new Rectangle(1218, 0, 1245, 600));
            energia = new Energia(content.Load<Texture2D>("LEVEL_JACK/energia"), new Vector2(50, 10), 1, window, content);
            
            vida = content.Load<Texture2D>("LEVEL_JACK/vidas");
            jack_tiro = content.Load<Texture2D>("LEVEL_JACK/ship_shoot");
            jack_asteroide1 = content.Load<Texture2D>("LEVEL_JACK/steroid_1");
            jack_m_piece1 = content.Load<Texture2D>("LEVEL_JACK/steroid_1_cima_esq");
            jack_m_piece2 = content.Load<Texture2D>("LEVEL_JACK/steroid_1_cima_dir");
            jack_m_piece3 = content.Load<Texture2D>("LEVEL_JACK/steroid_1_baixo_esq");
            jack_m_piece4 = content.Load<Texture2D>("LEVEL_JACK/steroid_1_baixo_mei");
            jack_m_piece5 = content.Load<Texture2D>("LEVEL_JACK/steroid_1_baixo_dir");

            tempoNave = new Temporizador(1000.0f);
            tempoPedacos = new Temporizador(5000.0f);

            shipVidaAnterior = jack_Ship.Vidas;
        }

        public void Update(GameTime gameTime, KeyboardState teclado, KeyboardState teclado_anterior, GameWindow Window)
        {
            #region TEMPORÁRIO
            if (teclado.IsKeyDown(Keys.G) && !teclado_anterior.IsKeyDown(Keys.G))
            {
                jogoEstado_atual = JogoEstado.GameOver;
            }

            if (teclado.IsKeyDown(Keys.O) && !teclado_anterior.IsKeyDown(Keys.O))
            {
                jack_Ship.Vidas += 1;
                mudarQtdVidas = true;
            }
            if (teclado.IsKeyDown(Keys.L) && !teclado_anterior.IsKeyDown(Keys.L))
            {
                jack_Ship.Vidas -= 1;
                mudarQtdVidas = true;
            }

            if (teclado.IsKeyDown(Keys.I) && !teclado_anterior.IsKeyDown(Keys.I))
            {
                jack_Ship.HP += 1;
            }
            if (teclado.IsKeyDown(Keys.K) && !teclado_anterior.IsKeyDown(Keys.K))
            {
                jack_Ship.HP -= 1;
            }
            #endregion

            #region Atualiza o HUD
            //===============
            // Atualiza o HUD
            /////////////////

            if (mudarQtdVidas == true)
            {
                qtdVidas = jack_Ship.Vidas;
                if (qtdVidas > 3)
                {
                    qtdVidas = 3;
                }

                Vidas.vidas.Clear();
                for (int i = 0; i < qtdVidas; i++)
                {
                    Vidas.vidas.Add(new Vidas(vida, new Vector2(55 + vidaPosX, 40)));
                    vidaPosX += 26;
                }
                vidaPosX = 0;
                mudarQtdVidas = false;
            }

            if (jack_Ship.HP == 2)
            {
                energia.current_animation = energia.Amarelo;
            }
            else if (jack_Ship.HP == 1)
            {
                energia.current_animation = energia.Vermelho;
            }
            else
            {
                energia.current_animation = energia.Verde;
            }

            if (jack_Ship.HP <= 0)
            {
                jack_Ship.Vidas -= 1;
                jack_Ship.HP = 3;
                mudarQtdVidas = true;
            }

            //========
            #endregion

            #region Posiciona e movimeta o fundo de tela
            //=====================================
            // Posiciona e movimeta o fundo de tela
            ///////////////////////////////////////
            
            if (fundo2.rectangle.X + fundo2.rectangle.Width <= 0)
            {
                fundo2.rectangle.X = fundo3.rectangle.X + fundo3.rectangle.Width;
            }
            if (fundo3.rectangle.X + fundo3.rectangle.Width <= 0)
            {
                fundo3.rectangle.X = fundo2.rectangle.X + fundo2.rectangle.Width;
            }
            
            if (jogoEstado_atual != JogoEstado.GameOver && jogoEstado_atual != JogoEstado.Pause)
            {
                fundo2.rectangle.X -= 1;
                fundo3.rectangle.X -= 1;
            }
            //========
            #endregion

            #region TEMPORIZADORES

            //Espera 1 segundo antes de permitir colisão novamente com a nave
            tempoNave.Update(gameTime);

            //Espera 1 segundo antes de permitir colisão com pedaços de asteróide
            tempoPedacos.Update(gameTime);

            #endregion

            //==========================
            // Verifica o estado do jogo
            ////////////////////////////
            switch (jogoEstado_atual)
            {
                
                //========================//
                case JogoEstado.Cena_Inicio:
                //========================//
                    #region Cena Inicial
                    //====================================================
                    // Reproduz a movimentação da nave entrando no cenário
                    //////////////////////////////////////////////////////

                    if (jack_Ship.PositionX <= 50)
                    {
                        jack_Ship.PositionX += 2;
                    }
                    else
                    {
                        jogoEstado_atual = JogoEstado.Jogo;
                    }
                    #endregion

                   break;
                //========//

                //=================//
                case JogoEstado.Jogo:
                //=================//

                    #region Atualiza jack_Ship
                    //========================
                    jack_Ship.naoAnima = false;
                    if (!menosVida)
                    {
                        jack_Ship.Update(gameTime, teclado, teclado_anterior);
                    }
                    #endregion

                    #region Desenha asteróide fora da tela e novo asteróide dependendo da posição do anterior
                    //==================================================================================
                    // Desenha asteróide fora da tela e novo asteróide dependendo da posição do anterior
                    ////////////////////////////////////////////////////////////////////////////////////

                    if (Jack_Meteor.list.Count <= 1 && meteorON)
                    {
                        Jack_Meteor.list.Add(new Jack_Meteor(jack_asteroide1,
                            new Vector2(Window.ClientBounds.Width + 100,
                                random.Next(Window.ClientBounds.Height - jack_asteroide1.Height))));

                        meteorON = false;
                    }

                    for (int i = 0; i < Jack_Meteor.list.Count; i++)
                    {
                        Jack_Meteor.list[i].Update(gameTime);
                        if (Jack_Meteor.list[i].PositionX < 300)
                        {
                            meteorON = true;
                        }
                    }
                    //========
                    #endregion

                    #region Desativa tiro ao passar da tela e/ou asteróide em caso de colisão de ambos
                    //===========================================================================
                    // Desativa tiro ao passar da tela e/ou asteróide em caso de colisão de ambos
                    /////////////////////////////////////////////////////////////////////////////

                    for (int i = 0; i < Shoot.list.Count; i++)
                    {
                        Shoot.list[i].Update(gameTime);
                        if (Shoot.list[i].PositionX > Window.ClientBounds.Width)
                        {
                            Shoot.list[i].Visible = false;
                        }

                        for (int j = 0; j < Jack_Meteor.list.Count; j++)
                        {
                            if (Jack_Meteor.list[j].Collision.Intersects(Shoot.list[i].Collision)
                                && Jack_Meteor.list[j].Visible && Shoot.list[i].Visible)
                            {
                                Jack_Meteor.list[j].Visible = false;
                                Shoot.list[i].Visible = false;
                                if (Jack_Meteor.list.Count <= 1)
                                {
                                    meteorON = true;
                                }
                            }
                        }
                    }
                    //========
                    #endregion

                    #region Desativa asteróide ao colidir com a nave
                    //=========================================
                    // Desativa asteróide ao colidir com a nave
                    ///////////////////////////////////////////

                    if (tempoNave.ativador == false)
                    {
                        for (int i = 0; i < Jack_Meteor.list.Count; i++)
                        {
                            if (Jack_Meteor.list[i].Collision.Intersects(jack_Ship.Collision)
                                && Jack_Meteor.list[i].Visible)
                            {
                                Jack_Meteor.list[i].Visible = false;
                                jack_Ship.HP -= 2;

                                if (Jack_Meteor.list.Count <= 1)
                                {
                                    meteorON = true;
                                }
                                tempoNave.ativador = true;
                            }
                        }
                    }
                    //========
                    #endregion

                    #region Desativa pedaços de asteróide ao colidir com a nave
                    //=====================================================
                    // Desativa pedaços de asteróide ao colidir com a nave
                    ///////////////////////////////////////////////////////

                    if (tempoNave.ativador == false)
                    {
                        for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                        {
                            if (Jack_M_Pieces.list[i].Collision1.Intersects(jack_Ship.Collision)
                                && Jack_M_Pieces.list[i].Visible1)
                            {
                                Jack_M_Pieces.list[i].Visible1 = false;
                                jack_Ship.HP -= 1;
                            }
                            if (Jack_M_Pieces.list[i].Collision2.Intersects(jack_Ship.Collision)
                                && Jack_M_Pieces.list[i].Visible2)
                            {
                                Jack_M_Pieces.list[i].Visible2 = false;
                                jack_Ship.HP -= 1;
                            }
                            if (Jack_M_Pieces.list[i].Collision3.Intersects(jack_Ship.Collision)
                                && Jack_M_Pieces.list[i].Visible3)
                            {
                                Jack_M_Pieces.list[i].Visible3 = false;
                                jack_Ship.HP -= 1;
                            }
                            if (Jack_M_Pieces.list[i].Collision4.Intersects(jack_Ship.Collision)
                                && Jack_M_Pieces.list[i].Visible4)
                            {
                                Jack_M_Pieces.list[i].Visible4 = false;
                                jack_Ship.HP -= 1;
                                tempoNave.ativador = true;
                            }
                            if (Jack_M_Pieces.list[i].Collision5.Intersects(jack_Ship.Collision)
                                && Jack_M_Pieces.list[i].Visible5)
                            {
                                Jack_M_Pieces.list[i].Visible5 = false;
                                jack_Ship.HP -= 1;
                            }
                        }
                    }
                    //========
                    #endregion

                    #region Desativa pedaços de asteróide ao colidir com asteróides inteiros
                    //=================================================================
                    // Desativa pedaços de asteróide ao colidir com asteróides inteiros
                    ///////////////////////////////////////////////////////////////////

                    for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                    {
                        for (int j = 0; j < Jack_Meteor.list.Count; j++)
                        {
                            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_Meteor.list[j].Collision)
                                && Jack_M_Pieces.list[i].Visible1 && Jack_Meteor.list[j].Visible)
                            {
                                Jack_M_Pieces.list[i].Visible1 = false;
                            }
                            if (Jack_M_Pieces.list[i].Collision2.Intersects(Jack_Meteor.list[j].Collision)
                                && Jack_M_Pieces.list[i].Visible2 && Jack_Meteor.list[j].Visible)
                            {
                                Jack_M_Pieces.list[i].Visible2 = false;
                            }
                            if (Jack_M_Pieces.list[i].Collision3.Intersects(Jack_Meteor.list[j].Collision)
                                && Jack_M_Pieces.list[i].Visible3 && Jack_Meteor.list[j].Visible)
                            {
                                Jack_M_Pieces.list[i].Visible3 = false;
                            }
                            if (Jack_M_Pieces.list[i].Collision4.Intersects(Jack_Meteor.list[j].Collision)
                                && Jack_M_Pieces.list[i].Visible4 && Jack_Meteor.list[j].Visible)
                            {
                                Jack_M_Pieces.list[i].Visible4 = false;
                            }
                            if (Jack_M_Pieces.list[i].Collision5.Intersects(Jack_Meteor.list[j].Collision)
                                && Jack_M_Pieces.list[i].Visible5 && Jack_Meteor.list[j].Visible)
                            {
                                Jack_M_Pieces.list[i].Visible5 = false;
                            }
                        }
                    }
                    //========
                    #endregion

                    // DESATIVADO
                    #region Desativa pedaços de asteróide ao colidir com outros pedaços de asteróide
                    //=========================================================================
                    // Desativa pedaços de asteróide ao colidir com outros pedaços de asteróide
                    ///////////////////////////////////////////////////////////////////////////

                    //for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                    //{
                    //    for (int j = 0; j < Jack_M_Pieces.list.Count; j++)
                    //    {
                    //        if (tempoPedacos.ativador == false)
                    //        {
                    //            #region Colisão de pedaço1 com 1 a 5
                    //            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_M_Pieces.list[j].Collision1)
                    //                && Jack_M_Pieces.list[i].Visible1 && Jack_M_Pieces.list[j].Visible1)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible1 = false;
                    //                Jack_M_Pieces.list[j].Visible1 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_M_Pieces.list[j].Collision2)
                    //                && Jack_M_Pieces.list[i].Visible1 && Jack_M_Pieces.list[j].Visible2)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible1 = false;
                    //                Jack_M_Pieces.list[j].Visible2 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_M_Pieces.list[j].Collision3)
                    //                && Jack_M_Pieces.list[i].Visible1 && Jack_M_Pieces.list[j].Visible3)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible1 = false;
                    //                Jack_M_Pieces.list[j].Visible3 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_M_Pieces.list[j].Collision4)
                    //                && Jack_M_Pieces.list[i].Visible1 && Jack_M_Pieces.list[j].Visible4)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible1 = false;
                    //                Jack_M_Pieces.list[j].Visible4 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision1.Intersects(Jack_M_Pieces.list[j].Collision5)
                    //                && Jack_M_Pieces.list[i].Visible1 && Jack_M_Pieces.list[j].Visible5)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible1 = false;
                    //                Jack_M_Pieces.list[j].Visible5 = false;
                    //            }
                    //            #endregion

                    //            #region Colisão de pedaço2 com 2 a 5
                    //            if (Jack_M_Pieces.list[i].Collision2.Intersects(Jack_M_Pieces.list[j].Collision2)
                    //                && Jack_M_Pieces.list[i].Visible2 && Jack_M_Pieces.list[j].Visible2)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible2 = false;
                    //                Jack_M_Pieces.list[j].Visible2 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision2.Intersects(Jack_M_Pieces.list[j].Collision3)
                    //                && Jack_M_Pieces.list[i].Visible2 && Jack_M_Pieces.list[j].Visible3)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible2 = false;
                    //                Jack_M_Pieces.list[j].Visible3 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision2.Intersects(Jack_M_Pieces.list[j].Collision4)
                    //                && Jack_M_Pieces.list[i].Visible2 && Jack_M_Pieces.list[j].Visible4)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible2 = false;
                    //                Jack_M_Pieces.list[j].Visible4 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision2.Intersects(Jack_M_Pieces.list[j].Collision5)
                    //                && Jack_M_Pieces.list[i].Visible2 && Jack_M_Pieces.list[j].Visible5)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible2 = false;
                    //                Jack_M_Pieces.list[j].Visible5 = false;
                    //            }
                    //            #endregion

                    //            #region Colisão de pedaço3 com 3 a 5
                    //            if (Jack_M_Pieces.list[i].Collision3.Intersects(Jack_M_Pieces.list[j].Collision3)
                    //                && Jack_M_Pieces.list[i].Visible3 && Jack_M_Pieces.list[j].Visible3)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible3 = false;
                    //                Jack_M_Pieces.list[j].Visible3 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision3.Intersects(Jack_M_Pieces.list[j].Collision4)
                    //                && Jack_M_Pieces.list[i].Visible3 && Jack_M_Pieces.list[j].Visible4)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible3 = false;
                    //                Jack_M_Pieces.list[j].Visible4 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision4.Intersects(Jack_M_Pieces.list[j].Collision5)
                    //                && Jack_M_Pieces.list[i].Visible4 && Jack_M_Pieces.list[j].Visible5)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible4 = false;
                    //                Jack_M_Pieces.list[j].Visible5 = false;
                    //            }
                    //            #endregion

                    //            #region Colisão de pedaço4 com 4 a 5
                    //            if (Jack_M_Pieces.list[i].Collision4.Intersects(Jack_M_Pieces.list[j].Collision4)
                    //                && Jack_M_Pieces.list[i].Visible4 && Jack_M_Pieces.list[j].Visible4)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible4 = false;
                    //                Jack_M_Pieces.list[j].Visible4 = false;
                    //            }
                    //            if (Jack_M_Pieces.list[i].Collision4.Intersects(Jack_M_Pieces.list[j].Collision5)
                    //                && Jack_M_Pieces.list[i].Visible4 && Jack_M_Pieces.list[j].Visible5)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible4 = false;
                    //                Jack_M_Pieces.list[j].Visible5 = false;
                    //            }
                    //            #endregion

                    //            #region Colisão de pedaço5 com 5
                    //            if (Jack_M_Pieces.list[i].Collision5.Intersects(Jack_M_Pieces.list[j].Collision5)
                    //                && Jack_M_Pieces.list[i].Visible5 && Jack_M_Pieces.list[j].Visible5)
                    //            {
                    //                Jack_M_Pieces.list[i].Visible5 = false;
                    //                Jack_M_Pieces.list[j].Visible5 = false;
                    //            }
                    //            #endregion
                    //        }
                    //    }
                    //}
                    //========
                    #endregion

                    #region Remove Asteroides ao sair da tela
                    //==================================
                    // Remove Asteroides ao sair da tela
                    ////////////////////////////////////

                    for (int i = 0; i < Jack_Meteor.list.Count; i++)
                    {
                        Jack_Meteor.list[i].Update(gameTime);
                        if (Jack_Meteor.list[i].PositionX < -100)
                        {
                            Jack_Meteor.list[i].Visible = false;
                        }
                    }
                    //========
                    #endregion

                    #region Desativa Asteróide e Desenha estilhaços
                    //========================================
                    // Desativa Asteróide e Desenha estilhaços
                    //////////////////////////////////////////

                    for (int i = 0; i < Jack_Meteor.list.Count; i++)
                    {
                        if (!Jack_Meteor.list[i].Visible)
                        {
                            Jack_M_Pieces.list.Add(new Jack_M_Pieces(
                                jack_m_piece1,
                                new Vector2(Jack_Meteor.list[i].PositionX,
                                    Jack_Meteor.list[i].PositionY),
                                jack_m_piece2,
                                new Vector2(Jack_Meteor.list[i].PositionX + 27,
                                    Jack_Meteor.list[i].PositionY),
                                jack_m_piece3,
                                new Vector2(Jack_Meteor.list[i].PositionX,
                                    Jack_Meteor.list[i].PositionY + 23),
                                jack_m_piece4,
                                new Vector2(Jack_Meteor.list[i].PositionX + 27,
                                    Jack_Meteor.list[i].PositionY + 24),
                                jack_m_piece5,
                                new Vector2(Jack_Meteor.list[i].PositionX + 54,
                                    Jack_Meteor.list[i].PositionY + 35)));

                            Jack_Meteor.list.RemoveAt(i);
                            tempoPedacos.ativador = true;
                        }
                    }
                    #endregion

                    #region Desativa estilhaços de Asteróide ao sair da tela
                    //=================================================
                    // Desativa estilhaços de Asteróide ao sair da tela
                    ///////////////////////////////////////////////////

                    for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                    {
                        Jack_M_Pieces.list[i].Update(gameTime);
                        if (Jack_M_Pieces.list[i].position1.X > Window.ClientBounds.Width ||
                            Jack_M_Pieces.list[i].position1.X < 0 - Jack_M_Pieces.list[i].texture1.Width)
                        {
                            Jack_M_Pieces.list[i].Visible1 = false;
                        }
                        if (Jack_M_Pieces.list[i].position1.Y > Window.ClientBounds.Height ||
                            Jack_M_Pieces.list[i].position1.Y < 0 - Jack_M_Pieces.list[i].texture1.Height)
                        {
                            Jack_M_Pieces.list[i].Visible1 = false;
                        }
                        if (Jack_M_Pieces.list[i].position2.X > Window.ClientBounds.Width ||
                            Jack_M_Pieces.list[i].position2.X < 0 - Jack_M_Pieces.list[i].texture2.Width)
                        {
                            Jack_M_Pieces.list[i].Visible2 = false;
                        }
                        if (Jack_M_Pieces.list[i].position2.Y > Window.ClientBounds.Height ||
                            Jack_M_Pieces.list[i].position2.Y < 0 - Jack_M_Pieces.list[i].texture2.Height)
                        {
                            Jack_M_Pieces.list[i].Visible2 = false;
                        }
                        if (Jack_M_Pieces.list[i].position3.X > Window.ClientBounds.Width ||
                            Jack_M_Pieces.list[i].position3.X < 0 - Jack_M_Pieces.list[i].texture3.Width)
                        {
                            Jack_M_Pieces.list[i].Visible3 = false;
                        }
                        if (Jack_M_Pieces.list[i].position3.Y > Window.ClientBounds.Height ||
                            Jack_M_Pieces.list[i].position3.Y < 0 - Jack_M_Pieces.list[i].texture3.Height)
                        {
                            Jack_M_Pieces.list[i].Visible3 = false;
                        }
                        if (Jack_M_Pieces.list[i].position4.X > Window.ClientBounds.Width ||
                            Jack_M_Pieces.list[i].position4.X < 0 - Jack_M_Pieces.list[i].texture4.Width)
                        {
                            Jack_M_Pieces.list[i].Visible4 = false;
                        }
                        if (Jack_M_Pieces.list[i].position4.Y > Window.ClientBounds.Height ||
                            Jack_M_Pieces.list[i].position4.Y < 0 - Jack_M_Pieces.list[i].texture4.Height)
                        {
                            Jack_M_Pieces.list[i].Visible4 = false;
                        }
                        if (Jack_M_Pieces.list[i].position5.X > Window.ClientBounds.Width ||
                            Jack_M_Pieces.list[i].position5.X < 0 - Jack_M_Pieces.list[i].texture5.Width)
                        {
                            Jack_M_Pieces.list[i].Visible5 = false;
                        }
                        if (Jack_M_Pieces.list[i].position5.Y > Window.ClientBounds.Height ||
                            Jack_M_Pieces.list[i].position5.Y < 0 - Jack_M_Pieces.list[i].texture5.Height)
                        {
                            Jack_M_Pieces.list[i].Visible5 = false;
                        }
                    }
                    //========
                    #endregion

                    #region Colisão entre tiro da nave e fragmentos do asteróide
                    //====================================================
                    //Colisão entre tiro da nave e fragmentos do asteróide
                    //////////////////////////////////////////////////////

                    for (int i = 0; i < Shoot.list.Count; i++)
                    {
                        for (int j = 0; j < Jack_M_Pieces.list.Count; j++)
                        {
                            if (Shoot.list[i].Collision.Intersects(Jack_M_Pieces.list[j].Collision1)
                                && Shoot.list[i].Visible && Jack_M_Pieces.list[j].Visible1)
                            {
                                Shoot.list[i].Visible = false;
                                Jack_M_Pieces.list[j].Visible1 = false;
                            }
                            if (Shoot.list[i].Collision.Intersects(Jack_M_Pieces.list[j].Collision2)
                                && Shoot.list[i].Visible && Jack_M_Pieces.list[j].Visible2)
                            {
                                Shoot.list[i].Visible = false;
                                Jack_M_Pieces.list[j].Visible2 = false;
                            }
                            if (Shoot.list[i].Collision.Intersects(Jack_M_Pieces.list[j].Collision3)
                                && Shoot.list[i].Visible && Jack_M_Pieces.list[j].Visible3)
                            {
                                Shoot.list[i].Visible = false;
                                Jack_M_Pieces.list[j].Visible3 = false;
                            }
                            if (Shoot.list[i].Collision.Intersects(Jack_M_Pieces.list[j].Collision4)
                                && Shoot.list[i].Visible && Jack_M_Pieces.list[j].Visible4)
                            {
                                Shoot.list[i].Visible = false;
                                Jack_M_Pieces.list[j].Visible4 = false;
                            }
                            if (Shoot.list[i].Collision.Intersects(Jack_M_Pieces.list[j].Collision5)
                                && Shoot.list[i].Visible && Jack_M_Pieces.list[j].Visible5)
                            {
                                Shoot.list[i].Visible = false;
                                Jack_M_Pieces.list[j].Visible5 = false;
                            }
                        }
                    }
                    //========
                    #endregion

                    #region Remove tiros
                    //=============
                    // Remove tiros
                    ///////////////

                    for (int i = 0; i < Shoot.list.Count; i++)
                    {
                        if (!Shoot.list[i].Visible)
                        {
                            Shoot.list.RemoveAt(i);
                        }
                    }
                    //========
                    #endregion

                    #region Remove todos os estilhaços
                    //===========================
                    // Remove todos os estilhaços
                    /////////////////////////////

                    for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                    {
                        if (!Jack_M_Pieces.list[i].Visible1 &&
                            !Jack_M_Pieces.list[i].Visible2 &&
                            !Jack_M_Pieces.list[i].Visible3 &&
                            !Jack_M_Pieces.list[i].Visible4 &&
                            !Jack_M_Pieces.list[i].Visible5)
                        {
                            Jack_M_Pieces.list.RemoveAt(i);
                        }
                    }
                    //========
                    #endregion

                    #region Ativa animação de reentrada da nave ao perder vidas

                    if (shipVidaAnterior > jack_Ship.Vidas)
                    {
                        menosVida = true;
                        jack_Ship.Position = jack_Ship.posicao_Inicial;
                        jack_Ship.current_animation = jack_Ship.Ship_Danger;
                        shipVidaAnterior = jack_Ship.Vidas;
                    }

                    if (menosVida)
                    {
                        tempoNave.ativador = true;
                        if (jack_Ship.PositionX <= 50)
                        {
                            jack_Ship.PositionX += 2;
                        }
                        else
                        {
                            jack_Ship.current_animation = jack_Ship.Ship_Anim;
                            menosVida = false;
                        }
                    }
                    #endregion

                    #region Causa do GameOver
                    //======================================
                    // Troca o estado do jogo para Game Over
                    ////////////////////////////////////////
                    if (jack_Ship.Vidas <= -1)
                    {
                        jogoEstado_atual = JogoEstado.GameOver;
                    }
                    //========
                    #endregion

                    #region Pausa o jogo
                    if (teclado.IsKeyDown(Keys.P) && !teclado_anterior.IsKeyDown(Keys.P))
                    {
                        jack_Ship.naoAnima = true;
                        jack_Ship.Update(gameTime, teclado, teclado_anterior);
                        jogoEstado_atual = JogoEstado.Pause;
                    }
                    #endregion

                   break;
                //========//

                //=======================//
                case JogoEstado.Cena_Final:
                //=======================//

                    //?

                   break;
                //========//

                //==================//
                case JogoEstado.Pause:
                //==================//

                    #region Despausa o jogo
                    //=====================
                    if (teclado.IsKeyDown(Keys.P) && !teclado_anterior.IsKeyDown(Keys.P))
                    {
                        jogoEstado_atual = JogoEstado.Jogo;
                    }
                    #endregion

                   break;
                //========//

                //=====================//
                case JogoEstado.GameOver:
                //=====================//
                    #region Reiniciar Jogo
                    if (teclado.IsKeyDown(Keys.R) && !teclado_anterior.IsKeyDown(Keys.R)
                        || teclado.IsKeyDown(Keys.B) && !teclado_anterior.IsKeyDown(Keys.B))
                    {
                        fundo2.rectangle.X = 0;
                        fundo3.rectangle.X = 1218;
                        
                        Shoot.list.Clear();
                        Jack_Meteor.list.Clear();
                        Jack_M_Pieces.list.Clear();
                        qtdVidas = 3;
                        jack_Ship.Position = new Vector2 (-300, Window.ClientBounds.Height / 2 - 44);
                        jack_Ship.HP = 3;
                        jack_Ship.Vidas = 3;
                        shipVidaAnterior = 3;
                        jack_Ship.Ship_Anim.fps = 8;
                        jack_Ship.Ship_Danger.fps = 8;
                        jack_Ship.naoAnima = false;
                        mudarQtdVidas = true;
                        jack_Ship.current_animation = jack_Ship.Ship_Anim;

                        if (mudarQtdVidas == true)
                        {
                            Vidas.vidas.Clear();
                            for (int i = 0; i < qtdVidas; i++)
                            {
                                Vidas.vidas.Add(new Vidas(vida, new Vector2(55 + vidaPosX, 40)));
                                vidaPosX += 26;
                            }
                            vidaPosX = 0;
                            mudarQtdVidas = false;
                        }

                        Jack_Meteor.list.Add(new Jack_Meteor(jack_asteroide1,
                            new Vector2(Window.ClientBounds.Width + 100,
                                 random.Next(Window.ClientBounds.Height - jack_asteroide1.Height))));

                        jogoEstado_atual = JogoEstado.Cena_Inicio;
                    }
                    #endregion

                    #region Voltar ao MENU
                    if (teclado.IsKeyDown(Keys.B) && teclado_anterior.IsKeyDown(Keys.B))
                    {
                        Game1.current_state = Game1.State.MENU;
                    }
                    #endregion

                   break;
                //========//
            }
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch, GameWindow Window)
        {
            #region Desenha HUD, nave e meteoros

            //Desenha o fundo
            fundo1.Draw(spriteBatch);
            fundo2.Draw(spriteBatch);
            fundo3.Draw(spriteBatch);

            //===================
            // Desenha HUD e nave
            /////////////////////

            if (jogoEstado_atual != JogoEstado.GameOver)
            {
                //Desenha a nave
                jack_Ship.Draw(gameTime, spriteBatch);

                #region Desenha tiros, asteróides e pedaços de asteróides
                for (int i = 0; i < Shoot.list.Count; i++)
                {
                    Shoot.list[i].Draw(gameTime, spriteBatch);
                }

                for (int i = 0; i < Jack_Meteor.list.Count; i++)
                {
                    Jack_Meteor.list[i].Draw(gameTime, spriteBatch);
                }

                for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                {
                    Jack_M_Pieces.list[i].Draw(gameTime, spriteBatch);
                }

                #endregion

                //Desenha as vidas restantes
                foreach (Vidas vidaX in Vidas.vidas)
                {
                    vidaX.Draw(gameTime, spriteBatch);
                }

                //Desenha a barra de energia
                energia.Draw(gameTime, spriteBatch);

                //Desenha a quantidade de vidas restantes
                if (jack_Ship.Vidas >= 10)
                {
                    spriteBatch.DrawString(Game1.arial24, jack_Ship.Vidas.ToString(),
                       new Vector2(5, 5), Color.CornflowerBlue);
                }
                else
                {
                    spriteBatch.DrawString(Game1.arial24, jack_Ship.Vidas.ToString(),
                       new Vector2(23, 5), Color.CornflowerBlue);
                }
            }      

            //========
            #endregion

            //==========================
            // Verifica o estado do jogo
            ////////////////////////////
            switch (jogoEstado_atual)
            {
                //=================//
                case JogoEstado.Jogo:
                //=================//

                    //?

                   break;
                //========//

                //==================//
                case JogoEstado.Pause:
                //==================//

                    #region Desenha tiros, asteróides e pedaços de asteróides
                    //=======================================================

                    for (int i = 0; i < Shoot.list.Count; i++)
                    {
                        Shoot.list[i].Draw(gameTime, spriteBatch);
                    }

                    for (int i = 0; i < Jack_Meteor.list.Count; i++)
                    {
                        Jack_Meteor.list[i].Draw(gameTime, spriteBatch);
                    }

                    for (int i = 0; i < Jack_M_Pieces.list.Count; i++)
                    {
                        Jack_M_Pieces.list[i].Draw(gameTime, spriteBatch);
                    }
                    #endregion

                    #region Escreve PAUSE no centro da tela
                    //=====================================
                    spriteBatch.DrawString(Game1.arial24, "PAUSE",
                       new Vector2((Window.ClientBounds.Width - Game1.arial24.MeasureString("PAUSE").X) / 2,
                       (Window.ClientBounds.Height - Game1.arial24.MeasureString("PAUSE").Y) / 2),
                       Color.DarkBlue);
                    #endregion

                   break;
                //========//

                //=====================//
                case JogoEstado.GameOver:
                //=====================//

                    #region Desenha as opções de Game Over
                   spriteBatch.DrawString(Game1.arial24, "GAME OVER",
                        new Vector2((Window.ClientBounds.Width - Game1.arial24.MeasureString("GAME OVER").X) /2,
                        (Window.ClientBounds.Height - Game1.arial24.MeasureString("GAME OVER").Y) /2),
                        Color.OrangeRed);

                    spriteBatch.DrawString(Game1.arial12, "(R) REINICIAR",
                       new Vector2((Window.ClientBounds.Width - Game1.arial12.MeasureString("(R) REINICIAR").X) / 2,
                       ((Window.ClientBounds.Height - Game1.arial12.MeasureString("(R) REINICIAR").Y) / 2) + 50),
                       Color.YellowGreen);

                    spriteBatch.DrawString(Game1.arial12, "(N) PROXIMO JOGO",
                       new Vector2((Window.ClientBounds.Width - Game1.arial12.MeasureString("(N) PROXIMO JOGO").X) / 2,
                       ((Window.ClientBounds.Height - Game1.arial12.MeasureString("(N) PROXIMO JOGO").Y) / 2) + 80),
                       Color.YellowGreen);

                    spriteBatch.DrawString(Game1.arial12, "(B) VOLTAR AO MENU",
                       new Vector2((Window.ClientBounds.Width - Game1.arial12.MeasureString("(B) VOLTAR AO MENU").X) / 2,
                       ((Window.ClientBounds.Height - Game1.arial12.MeasureString("(B) VOLTAR AO MENU").Y) / 2) + 110),
                       Color.YellowGreen);
                    #endregion

                   break;
                //========//
            }
        }
    }
}
